/**
 * @file LoteDAO.java
 * @brief Obtiene y actualiza la información de la BD referente a los Lotes.
 *
 * Copyright (C)  - April [2011]
 *
 * @author Miguel Ángel Díaz López
 * @version 01.00
 *
 * @footnote e-mail:  admin    at etsiit.es
 */


package GestorFarmacia;

import Definiciones.Definiciones;
import java.io.IOException;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import Servicios.Conexion;
import java.util.ArrayList;


/**
 * @class LoteDAO
 * @brief Obtiene y actualiza la información de la BD referente a los Lotes.
 */
public class LoteDAO {

    /* Métodos de clase */
    public static void add ( Lote lote ) throws SQLException, IOException, ClassNotFoundException {
        Conexion.conectar();
	DateFormat formato_fecha = new SimpleDateFormat("yyyy-MM-dd");
        String estado = lote.getEstadoLote().toString();
        if(estado.equals("DISPONIBLE"))estado="a";
        else if(estado.equals("TERMINADO"))estado="b";
        else estado="c"; //DESECHADO
        Conexion.actualizar("INSERT Lote(unidadesIniciales,unidadesRestantes,fechaLlegada,fechaCaducidad,"
                            + "estado,esDe)"
                            + " VALUES ("
                            + lote.getUnidadesInicialesLote()
                            + "," + lote.getUnidadesRestantesLote()
                            + ",\'" + formato_fecha.format(lote.getFechaLlegadaLote()) + "\'"
                            + ",\'" + formato_fecha.format(lote.getFechaCaducidadLote()) + "\'"
                            + ",\'" + estado + "\'"
                            + "," + lote.getIdMedicamento() + ");");
	Conexion.desconectar();
    }

    public static void delete ( Lote lote ) throws SQLException, IOException, ClassNotFoundException {
        // Borrado lógico del Lote
        lote.setEstadoLote(Definiciones.Estado.DESECHADO);
        Lote.update(lote);/*
        Conexion.conectar();
	Conexion.actualizar("DELETE FROM Lote WHERE idLote="+lote.getIdLote()+";");
        Conexion.desconectar();*/
    }

    public static void update ( Lote lote ) throws SQLException, IOException, ClassNotFoundException {
        Conexion.conectar();
	DateFormat formato_fecha = new SimpleDateFormat("yyyy-MM-dd");
        String estado = lote.getEstadoLote().toString();
        if(estado.equals("DISPONIBLE"))estado="a";
        else if(estado.equals("TERMINADO"))estado="b";
        else estado="c"; //DESECHADO
	Conexion.actualizar("UPDATE Lote SET   unidadesIniciales=" + lote.getUnidadesInicialesLote()
                                          + ", unidadesRestantes=" + lote.getUnidadesRestantesLote()
                                          + ", fechaLlegada=\'"    + formato_fecha.format(lote.getFechaLlegadaLote()) + "\'"
                                          + ", fechaCaducidad=\'"  + formato_fecha.format(lote.getFechaCaducidadLote()) + "\'"
                                          + ", estado=\'"          + estado + "\'"
                                          + ", esDe="              + lote.getIdMedicamento()
                                          + " WHERE idLote="       + lote.getIdLote() + ";");
	Conexion.desconectar();
    }

    public static Lote get ( Integer id_lote ) throws SQLException, IOException, ClassNotFoundException, ParseException {
        Lote lote_buscado = null;
        ResultSet lote;
        DateFormat formatoFecha = new SimpleDateFormat("yyyy-MM-dd");

        Conexion.conectar();
	lote = Conexion.consultar("SELECT * FROM Lote WHERE idLote="+id_lote+";");
	// Creamos el Medicamento consultado de la BD
        if(lote.next()){
            lote_buscado = new Lote();
            Definiciones.Estado estado;
            if(lote.getString("estado").equals("a")) estado = Definiciones.Estado.DISPONIBLE;
            else if(lote.getString("estado").equals("b")) estado = Definiciones.Estado.TERMINADO;
            else estado = Definiciones.Estado.DESECHADO;
            lote_buscado.setIdLote(lote.getInt("idLote"));
            lote_buscado.setUnidadesInicialesLote(lote.getInt("unidadesIniciales"));
            lote_buscado.setUnidadesRestantesLote(lote.getInt("unidadesRestantes"));
            lote_buscado.setFechaLlegadaLote(formatoFecha.parse(lote.getString("fechaLlegada")));
            lote_buscado.setFechaCaducidadLote(formatoFecha.parse(lote.getString("fechaCaducidad")));
            lote_buscado.setEstadoLote(estado);
            lote_buscado.setIdMedicamento(lote.getInt("esDe"));
        }
        Conexion.desconectar();
        
        return lote_buscado;
    }

    public static Lote[] get (Integer id_medicamento, Integer unidades_iniciales, Integer unidades_restantes, Date fecha_llegada,
                                Date fecha_caducidad, Definiciones.Estado estado)
                                throws SQLException, IOException, ClassNotFoundException, ParseException {
        Lote[] v_lotes = null;
        String busqueda = "";
        ArrayList<Lote> l_lotes = new ArrayList<Lote>();
        Definiciones.Estado estado_;
        DateFormat formatoFecha = new SimpleDateFormat("yyyy-MM-dd");
        ResultSet lote;

        // Generamos la consulta a la BD
        if(id_medicamento != null) busqueda += "esDe=" + id_medicamento;
        if(unidades_iniciales != null) {
            if(!busqueda.equals("")) busqueda += " AND ";
            busqueda += "unidadesIniciales=" + unidades_iniciales;
        }
        if(unidades_restantes != null) {
            if(!busqueda.equals("")) busqueda += " AND ";
            busqueda += "unidadesRestantes=" + unidades_restantes;
        }
        if(fecha_llegada != null) {
            if(!busqueda.equals("")) busqueda += " AND ";
            busqueda += "fechaLlegada=\'" + formatoFecha.parse(fecha_llegada.toString()) + "\'";
        }
        if(fecha_caducidad != null) {
            if(!busqueda.equals("")) busqueda += " AND ";
            busqueda += "fechaCaducidad=\'" + formatoFecha.parse(fecha_caducidad.toString()) + "\'";
        }
        if(estado != null){
            if(!busqueda.equals("")) busqueda += " AND ";
            if(estado.toString().equals("DISPONIBLE")) busqueda += "estado=\'a\'";
            else if(estado.toString().equals("TERMINADO")) busqueda += "estado=\'b\'";
            else busqueda += "estado=\'c\'";
        }
        Conexion.conectar();
	if(!busqueda.equals("")) lote = Conexion.consultar("SELECT * FROM Lote WHERE " + busqueda + ";");
        else lote = Conexion.consultar("SELECT * FROM Lote");

	// Creamos el listado de Medicamentos
        while(lote.next()){
            if(lote.getString("estado").equals("a")) estado_ = Definiciones.Estado.DISPONIBLE;
            else if(lote.getString("estado").equals("b")) estado_ = Definiciones.Estado.TERMINADO;
            else estado_ = Definiciones.Estado.DESECHADO;
            l_lotes.add(new Lote(lote.getInt("idLote"),lote.getInt("unidadesIniciales"),lote.getInt("unidadesRestantes"),
                                 formatoFecha.parse(lote.getString("fechaLlegada")),formatoFecha.parse(lote.getString("fechaCaducidad")),
                                 estado_,lote.getInt("esDe")));
        }
        Conexion.desconectar();

        // Devolvemos vector de medicamentos
        if(l_lotes.size()>0){
            v_lotes = new Lote[l_lotes.size()];
            l_lotes.toArray(v_lotes);
        }
        return v_lotes;
    }
    
}
